#ifndef __CLIENTFUNC_H_
#define __CLIENTFUNC_H_

#include <stdbool.h>
#include "../GlobalMessage.h"
#include "FileSystem.h"
#include "StdTcp.h"

int LoginFace();
//注册
MSG SignUp(char *MyName);
//是否注册成功
bool IsSignUpSuccess(MSG *m);
//登录
MSG Login(char *MyName);
//是否登录成功
bool IsLoginSuccess(MSG *m);
//功能选择界面
int Interface();
//私聊
MSG ChatToClient();
//广播
MSG ChatBroadCast();
//查看在线用户
MSG GetServerOnlineList();
//解析列表字符串
void ShowOnlineList(MSG *m);
//文件发送
MSG SendFile();
//获取文件名称
char* GetFileNameFromPath(const char * filePath);
//写数据到本地文件
void WriteToLocal(MSG *m);

//网盘界面
int CloudInterface();
//上传文件
MSG UpLoadFile();
// x下载文件
MSG DownLoadFile();




// 通用的字符串切割函数
/*
    这一行定义了函数 Splite，它接受三个参数：
str：指向要分割的常量字符数组（字符串）的指针。
delim：指向用于分割输入字符串的分隔符的常量字符数组（字符串）的指针。
size：一个整数指针，用于存储结果数组的大小。
*/
char ** Splite(const char * str, const char *delim, int * size);// 字符串数组所以用char **

// 释放字符串
void FreeStrList(char ** strList, int size);

// 显示文件列表
void showFileList(MSG *m);




// 好友管理界面
int FriendManageInterface();

// 添加好友
MSG AddNewFriend();

// 我的好友列表
bool ShowMyFriendList(const char *list);

// 删除好友
MSG DeleteFriend();

//好友聊天循环
void FriendChatLoop(TcpC *c,const char* myname);

//好友聊天消息展示
void ShowFriendMessages(MSG messages[],const char *myname,int size);

// 好友添加响应
int FriendAddResponse(const char *name);

// 展示好友申请列表
int ShowFriendApplyList(const char *list);

// 客户端回应好友申请
MSG ResponseFriendApplication();






// 群管理界面
int GroupManageInterface();

//创建群
MSG GroupCreate();

//邀请入群
MSG InviteWhoGroup();

//展示群邀请信息
void ShowGroupInvite(MSG *m);

//处理群邀请通知
MSG HandleInviteFunc();

//群聊天循环
void GroupChatLoop(TcpC*c,const char *myname, const char *groupname);

//展示群组消息
void ShowGroupMessages(MSG messages[],const char *myname,int size);

//群列表
void ShowGroupList(MSG *m);

//删除群
MSG DeleteGroup();





// 显示文件列表
void showFileList(MSG *m);

struct PacketFile;
typedef struct PacketFile PackFile;

//  初始化文件结构体 返回文件结构体指针
PackFile * PacketFileInit(const char *filePath);

// 从文件f读取size大小的数据，并更新当前位置
void ReadFromFile(PackFile*f,void *p,int*size);

bool IsFileEnd(PackFile *f);

// 释放文件结构体
void ClearPacketFile(PackFile *f);

#endif